特定于用户的 G 代码函数
这个 CNC11_CustomFunctions.project
示例项目位于的安装目录中 CODESYS 下面 ..\CODESYS SoftMotion\Examples
。
此示例说明如何创建自己的函数以用于 G 代码中的表达式。
有关 G 代码中表达式和函数的更多信息,请参阅: 表达式。在这里,您将找到默认支持的所有运算符和函数的列表。
该示例定义了 SEL 操作符来自 IEC 61131-3,因此也可以在 G 代码中使用。
应用程序的结构
与CNC应用程序一样,该应用程序包括路径处理(CNC_PreparePath
程序)和插值(CNC
程序)。由于插值与其他示例没有区别,因此此处将不进一步讨论该主题
在低优先级中,每隔 20 毫秒循环调用路径处理 PathTask
。在高优先级中,每 4 毫秒循环调用插值 MotionTask
。后台任务 VISU_TASK
是为可视化定义的。
在可视化中,您可以开始处理 G 代码并设置变量的值 $LONGLINE$
。G 代码和机器的移动(3D 龙门架)显示在可视化的右侧
G 代码
数控
LET #WIDTH : LREAL N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110) N20 F50 E100 E-100 N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2 N40 Y-#WIDTH N50 X-#WIDTH Z-#WIDTH/2 N60 Y#WIDTH N70 X0 Y0 Z0
第 1 行:局部变量的声明 #WIDTH
类型的 LREAL
。
第 2 行,区块 N10:赋值 SEL($LONGLINE$, 40, 110)
到变量 #WIDTH
。如果 PLC 变量的值 $LONGLINE$
是 TRUE
,则表达式的值为 110;否则为 40。
在以下几行中,遍历一个在 Z 方向上有额外移动的矩形;矩形一边的长度为 2*#WIDTH
。
的实施 SEL
函数

要创建用户定义的函数,你需要编写一个函数块来实现 SMC_NC_IFunction
接口。
有关更多信息,请参阅: smc_nc_iFunction。
GetSignature
。此处返回函数参数的返回类型、计数和类型。在此示例中,SEL
函数返回类型为的值T_OTHER
并有 3 个类型的参数T_BOOL
,T_OTHER
,以及T_OTHER
。T_OTHER
代表任何类型(要么T_BOOL
,T_LREAL
,或T_STRING
]。的所有 3 次出现T_OTHER
必须具有相同的类型。METHOD GetSignature VAR_OUTPUT resultType : SMC_GVar_Type; nNumArguments : UDINT; pType : POINTER TO SMC_GVar_Type; END_VAR VAR argTypes : ARRAY[0..2] OF SMC_GVar_Type := [SMC_GVar_Type.T_BOOL, SMC_GVar_Type.T_OTHER, SMC_GVar_Type.T_OTHER]; END_VAR resultType := SMC_GVAR_Type.T_OTHER; nNumArguments := 3; pType := ADR(argTypes);
Call
:处理 G 代码时调用此方法。参数是通过传递的pa
输入。这个表情pa[0].argValue.bValue
用于访问第一个参数的布尔值。取决于第二个参数的类型pa[1].argType
,结果是返回值result.argType
然后分支成一个 CASE 语句。METHOD Call VAR_IN_OUT result : SMC_NC_GArgument; END_VAR VAR_INPUT pa : POINTER TO SMC_NC_GArgument; END_VA RVAR_OUTPUT eError : SMC_ERROR; END_VAR VAR g : BOOL; END_VAR g := pa[0].argValue.bValue; result.argType := pa[1].argType; CASE result.argType OF SMC_GVAR_Type.T_BOOL: result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue); SMC_GVAR_Type.T_STRING: result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue); SMC_GVAR_Type.T_LREAL: result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue); ELSE eError := SMC_INVALID_PARAMETER; END_CASE
的配置 SMC_ReadNCFile2
的一个实例 CNC_Sel
函数块是在 GVL_CNCFunctions
全局变量列表。
一个数组 aCNCFunctions
长度为 1 的使用功能块的名称和实例进行初始化。然后将该数组链接到表中 funTable
类型的 SMC_NC_GFunctionTable
。
aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction := [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)]; funTable : SMC_NC_GFunctionTable := (numFunctions:= 1, pFunction:= ADR(aCNCFunctions)) ;
最后,将此表传递给 SMC_ReadNCFile2
功能块:
rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE); [...] rncf2( bExecute:= TRUE, sFileName:= sFileName, pCustomFunTable:= ADR(funTable), pvl:= ADR(varList));
调试
生成应用程序并将其下载到控制器。
启动应用程序,切换到可视化,然后按
Start
。你可以使用Longline
用于设置变量值的单选按钮$LONGLINE$
在 G 代码中TRUE
或者FALSE
。